
const { arrayMethods } =required('./array.js')

class Observer{
  constructor(value){
    Object.defineProperty(value,'__ob__',{
      value:this,
      enumerable:false,//不可枚举
      writable:true,//可修改
      configurable:true,//可设置
    })

    //数组和对象分开处理
    if(Array.isArray(value)){
      value.__proto__=arrayMethods
      this.observerArray(value)
    }else{
      this.walk(value)
    }
  }

  walk(data){
    let keys=Object.keys(data)
    for(let i=0;i<keys.length;i++){
      const key=keys[i]
      const value=data[key]
      defineReactive(data,key,value)
    }
  }

  observerArray(items){
    for (let i = 0; i < items.length; i++) observer(items[i])
  }
}

function defineReactive(data,key,value){
    Object.defineProperty(data,key,{
      value,
      get(){
        console.log('获取数据')
        return value
      },
      set(newValue){
        if(newValue===value)return
        console.log('设置数据')
        value=newValue
      }
    })
  }

function observer(item){
  //数组里的元素如果是数组或对象则进行响应式处理
  if(Object.prototype.toString.call(item)==='[object Object]'||Array.isArray(item))return new Observer(item)
}